package com.tek.ding.faceding.utils;

import android.content.Context;

import com.alibaba.sdk.android.oss.ClientConfiguration;
import com.alibaba.sdk.android.oss.ClientException;
import com.alibaba.sdk.android.oss.OSS;
import com.alibaba.sdk.android.oss.OSSClient;
import com.alibaba.sdk.android.oss.ServiceException;
import com.alibaba.sdk.android.oss.callback.OSSCompletedCallback;
import com.alibaba.sdk.android.oss.common.auth.OSSCredentialProvider;
import com.alibaba.sdk.android.oss.common.auth.OSSPlainTextAKSKCredentialProvider;
import com.alibaba.sdk.android.oss.internal.OSSAsyncTask;
import com.alibaba.sdk.android.oss.model.PutObjectRequest;
import com.alibaba.sdk.android.oss.model.PutObjectResult;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;

public class OssService {
    private OSS oss;
    private String bucketName = "dingding-face";

    private String accessKeyId = "LTAI5tBbhjmR1ff1EHLQBgDf";

    private String accessKeySecret = "P09ItbJF4IuMu3cIOQCFH5S3PiK33x";

    private String endpoint = "http://oss-cn-shanghai.aliyuncs.com";

    private Context context;
    // 文件存储目录
//    private static final String fileDir = "testFace/";

    private ProgressCallback progressCallback;

    public OssService(Context context) {
        this.context = context;
    }


    public OssService(Context context, String accessKeyId, String accessKeySecret, String endpoint, String bucketName) {
        this.context = context;
        this.endpoint = endpoint;
        this.bucketName = bucketName;
        this.accessKeyId = accessKeyId;
        this.accessKeySecret = accessKeySecret;
    }


    public void initOSSClient() {
        //OSSCredentialProvider credentialProvider = new OSSStsTokenCredentialProvider("<StsToken.AccessKeyId>", "<StsToken.SecretKeyId>", "<StsToken.SecurityToken>");
        //这个初始化安全性没有Sts安全，如需要很高安全性建议用OSSStsTokenCredentialProvider创建（上一行创建方式）多出的参数SecurityToken为临时授权参数
        OSSCredentialProvider credentialProvider = new OSSPlainTextAKSKCredentialProvider(accessKeyId, accessKeySecret);
        ClientConfiguration conf = new ClientConfiguration();
        conf.setConnectionTimeout(15 * 1000); // 连接超时，默认15秒
        conf.setSocketTimeout(15 * 1000); // socket超时，默认15秒
        conf.setMaxConcurrentRequest(8); // 最大并发请求数，默认5个
        conf.setMaxErrorRetry(2); // 失败后最大重试次数，默认2次

        // oss为全局变量，endpoint是一个OSS区域地址
        oss = new OSSClient(context, endpoint, credentialProvider, conf);

    }


//    public void beginupload(Context context, String filename, String path) {
//        //通过填写文件名形成objectname,通过这个名字指定上传和下载的文件
//        String objectname = filename;
//        if (objectname == null || objectname.equals("")) {
//            MyToastUtils.showLong("文件名不能为空");
//            return;
//        }
//        String urlName = fileDir.concat(nowToDateFullDate()).concat("/").concat(objectname);
//        //下面3个参数依次为bucket名，Object名，上传文件路径
//        PutObjectRequest put = new PutObjectRequest(bucketName, urlName, path);
//        if (path == null || path.equals("")) {
//            MyToastUtils.showLong("请选择图片");
//            //ToastUtils.showShort("请选择图片....");
//            return;
//        }
//        LogUtils.d("正在上传中....");
//        //ToastUtils.showShort("正在上传中....");
//        // 异步上传，可以设置进度回调
//        put.setProgressCallback((request, currentSize, totalSize) -> {
//            LogUtils.d("currentSize: " + currentSize + " totalSize: " + totalSize);
//            double progress = currentSize * 1.0 / totalSize * 100.f;
//
//            if (progressCallback != null) {
//                progressCallback.onProgressCallback(progress);
//            }
//        });
//        @SuppressWarnings("rawtypes")
//        OSSAsyncTask task = oss.asyncPutObject(put, new OSSCompletedCallback<PutObjectRequest, PutObjectResult>() {
//            @Override
//            public void onSuccess(PutObjectRequest request, PutObjectResult result) {
//                LogUtils.d("上传成功");
//                LogUtils.d(result.toString());
//                MyToastUtils.showLong("上传成功");
//                String url = oss.presignPublicObjectURL(bucketName, urlName);
//                LogUtils.d(url);
//            }
//
//            @Override
//            public void onFailure(PutObjectRequest request, ClientException clientExcepion, ServiceException serviceException) {
//                // 请求异常
//                LogUtils.d("UploadFailure");
//                MyToastUtils.showLong("上传失败");
//                if (clientExcepion != null) {
//                    // 本地异常如网络异常等
//                    LogUtils.e("UploadFailure：表示向OSS发送请求或解析来自OSS的响应时发生错误。\n" +
//                            "  *例如，当网络不可用时，这个异常将被抛出");
//                    clientExcepion.printStackTrace();
//                }
//                if (serviceException != null) {
//                    // 服务异常
//                    LogUtils.e("UploadFailure：表示在OSS服务端发生错误");
//                    LogUtils.e("ErrorCode", serviceException.getErrorCode());
//                    LogUtils.e("RequestId", serviceException.getRequestId());
//                    LogUtils.e("HostId", serviceException.getHostId());
//                    LogUtils.e("RawMessage", serviceException.getRawMessage());
//                }
//            }
//        });
//        //task.cancel(); // 可以取消任务
//        //task.waitUntilFinished(); // 可以等待直到任务完成
//    }

    /**
     * 上传的最终方法，成功返回则一个路径
     *
     * @param objKey 上传上去后，在服务器上的独立的KEY
     * @param path   需要上传的文件的路径
     * @return 存储的地址
     */
//    public String upload(String objKey, String path) {
//        // 构造一个上传请求
//        objKey = fileDir.concat(nowToDateFullDate()).concat("/").concat(objKey);
//        PutObjectRequest request = new PutObjectRequest(bucketName, objKey, path);
//
//        try {
//            // 初始化上传的Client
//            // 开始同步上传
//            PutObjectResult result = oss.putObject(request);
//            LogUtils.d("upload: result=" + result);
//            // 得到一个外网可访问的地址
//            String url = oss.presignPublicObjectURL(bucketName, objKey);
//            // 格式打印输出
//            LogUtils.d("upload: result=" + url);
//            return url;
//        } catch (Exception e) {
//            e.printStackTrace();
//            // 如果有异常则返回空
//            return null;
//        }
//    }

    /**
     * 上传的最终方法，成功返回则一个路径
     *
     * @param path 需要上传的文件的路径
     * @return 存储的地址
     */
//    public String upload(String path) {
//        //文件名
//        String substring = path.substring(path.lastIndexOf(".")).toLowerCase();
//        String objKey = UUID.randomUUID().toString().toUpperCase().replace("-", "") + substring;
//        //路径
////        objKey = fileDir.concat(nowToDateFullDate()).concat("/").concat(objKey);
//        objKey = fileDir.concat(objKey);
//        //构造一个上传请求
//        PutObjectRequest request = new PutObjectRequest(bucketName, objKey, path);
//        try {
//            // 初始化上传的Client
//            // 开始同步上传
//            PutObjectResult result = oss.putObject(request);
//            LogUtils.d("upload: result=" + result);
//            // 得到一个外网可访问的地址
//            String url = oss.presignPublicObjectURL(bucketName, objKey);
//            // 格式打印输出
//            LogUtils.d("upload: result=" + url);
//            return url;
//        } catch (Exception e) {
//            e.printStackTrace();
//            // 如果有异常则返回空
//            return null;
//        }
//    }

    /**
     * 上传的最终方法，成功返回则一个路径
     *
     * @param path 需要上传的文件的路径
     * @return 存储的地址
     */
    public String uploadFace(String faceFileDir, String path) {
        //文件名
        String substring = path.substring(path.lastIndexOf(".")).toLowerCase();
        String objKey = UUID.randomUUID().toString().toUpperCase().replace("-", "") + substring;
        //路径
//        objKey = fileDir.concat(nowToDateFullDate()).concat("/").concat(objKey);
        objKey = faceFileDir.concat(objKey);
        //构造一个上传请求
        PutObjectRequest request = new PutObjectRequest(bucketName, objKey, path);
        try {
            // 初始化上传的Client
            // 开始同步上传
            PutObjectResult result = oss.putObject(request);
//            LogUtils.d("upload: result=" + result);
            // 得到一个外网可访问的地址
            String url = oss.presignPublicObjectURL(bucketName, objKey);
            // 格式打印输出
//            LogUtils.d("upload: result=" + url);
            return url;
        } catch (Exception e) {
            e.printStackTrace();
            // 如果有异常则返回空
            return null;
        }
    }


    public ProgressCallback getProgressCallback() {
        return progressCallback;
    }

    public void setProgressCallback(ProgressCallback progressCallback) {
        this.progressCallback = progressCallback;
    }

    public interface ProgressCallback {
        void onProgressCallback(double progress);
    }

    /**
     * 将当前时间转换为"yyyyMMdd"字符串
     *
     * @return "yyyyMMdd"格式时间字符串
     */
    public static String nowToDateFullDate() {
        String result = "";
        try {
            SimpleDateFormat yyyyMMdd = new SimpleDateFormat("yyyyMMdd");
            result = yyyyMMdd.format(new Date());
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }
}
